//  <T> 代表当前类是一个泛型类
//  < >中只能是引用类型不能是基本类型
//extends 在泛型里叫做上界 时拓展的用法
class Alg{
    //泛型方法
    //也可以静态public static <T extends Comparable<T>> T findMax(T[] array)
    //static修饰不需再实例化 类名调用方法
    public  <T extends Comparable<T>> T findMax(T[] array){
        T max = array[0];
        for(int i = 0; i < array.length; i++){
            if(array[i].compareTo(max)>0){
                max = array[i];
            }
        }
        return max;
    }
}
/*class Alg<T extends Comparable<T>>{
    //T extends Comparable<T> T一定是实现Comparable接口的
    public T findMax(T[] array){
        T max = array[0];//声明了一个类型为T的变量，名为max。
                         // 将array[0]的值赋给了这个新声明的变量max
        for(int i = 0; i < array.length; i++){
            if(array[i].compareTo(max)>0){
                max = array[i];
            }
        }
        return max;
    }
}*/
class MyArray<T>{
    //public T[] = new T[10]; 不允许实例化一个泛型数组
    //public T[] array = (T[])new Object[10];//这样写也不好

    public Object[] array = new Object[10];//这样写
    //Object[] 表示这是一个对象数组
    // 可以存储任何类型的对象，因为Object是Java中所有类的根类。
    public void set(int pos,T val){
        array[pos] = val;
    }
    public T get(int pos){
        return (T)array[pos];
    }
}
/*
* 写一个泛型 实现一个方法 这个发方法试求指定类型数组的最大值的
* */
class A implements Comparable<A>{
    @Override
    public int compareTo(A o) {
        return 0;
    }
}
public class Test2 {
    public static void main(String[] args) {
        Alg alg2 = new Alg();
        Integer[] array = {1,2,3,4,5};
        Integer ret = alg2.findMax(array);
        System.out.println(ret);
    }

    public static void main3(String[] args) {
        //Alg<Integer> alg2 = new Alg<>();
        Integer[] array = {1,2,3,4,5};
        //Integer ret = alg2.findMax(array);
        //System.out.println(ret);
    }
    public static void main2(String[] args) {
        MyArray<String> myArray = new MyArray();
        myArray.set(0,"hello");
        //myArray.set(1,90);//此时这里报错 因为前面已经指定传入String类型
        String str =  myArray.get(0);//这里不需要强转
        System.out.println(str);

    }
    public static void main1(String[] args) {
        MyArray <String>myArray = new MyArray();
        myArray.set(0,"hello");
        MyArray<Integer>myArray1 = new MyArray<>();
        myArray1.set(1,90);
        String str = (String) myArray.get(0);//get()返回的是Object类型 需要强转
        int ret1 = myArray1.get(1);
        System.out.println(str);
        System.out.println(ret1);

    }

}
